home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / misc / interfaces3_5.lha / Interfaces / IFFParse.mod < prev    next >
Text File  |  1994-06-25  |  16KB  |  348 lines

  1. (*
  2. (*
  3. **  Amiga Oberon Interface Module:
  4. **  $VER: IFFParse.mod 40.15 (28.12.93) Oberon 3.1
  5. **
  6. **   © 1993 by Fridtjof Siebert
  7. **   updated for V39, V40 by hartmut Goebel
  8. *)
  9. *)
  10.  
  11. MODULE IFFParse;
  12.  
  13. IMPORT
  14.   e * := Exec,
  15.   cb* := ClipBoard,
  16.   u * := Utility,
  17.   y * := SYSTEM;
  18.  
  19. CONST
  20.   iffparseName * = "iffparse.library";
  21.  
  22. (* Struct associated with an active IFF stream.
  23.  * "IFFHandle.stream" is a value used by the client's read/write/seek functions -
  24.  * it will not be accessed by the library itself and can have any value
  25.  * (could even be a pointer or a BPTR).
  26.  *
  27.  * This structure can only be allocated by iffparse.library
  28.  *)
  29.  
  30. TYPE
  31.   IFFHandlePtr * = UNTRACED POINTER TO IFFHandle;
  32.   IFFHandle * = STRUCT
  33.     stream * : LONGINT;
  34.     flags * : LONGSET;
  35.     depth * : LONGINT;      (* Depth of context stack *)
  36.   END;
  37.  
  38. CONST
  39. (* bit masks for "IFFHandle.flags" field *)
  40.   read      * = LONGSET{};           (* read mode - default *)
  41.   write     * = LONGSET{0};          (* write mode *)
  42.   rwBits    * = read + write;        (* read/write bits *)
  43.   fSeek     * = LONGSET{1};          (* forward seek only *)
  44.   rSeek     * = LONGSET{2};          (* random seek *)
  45.   reserved  * = LONGSET{16..31};     (* Don't touch these bits *)
  46.  
  47.  
  48. TYPE
  49. (*****************************************************************************)
  50. (* When the library calls your stream handler, you'll be passed a pointer
  51.  * to this structure as the "message packet".
  52.  *)
  53.   IFFStreamCmdPtr * = UNTRACED POINTER TO IFFStreamCmd;
  54.   IFFStreamCmd * = STRUCT
  55.     command * : LONGINT;     (*  Operation to be performed (IFFCMD_) *)
  56.     buf * : e.APTR;          (*  Pointer to data buffer              *)
  57.     nBytes * : LONGINT;      (*  Number of bytes to be affected      *)
  58.   END;
  59.  
  60.  
  61. (*****************************************************************************)
  62.  
  63. (* A node associated with a context on the iff_Stack.  Each node
  64.  * represents a chunk, the stack representing the current nesting
  65.  * of chunks in the open IFF file.  Each context node has associated
  66.  * local context items in the (private) LocalItems list.  The ID, type,
  67.  * size and scan values describe the chunk associated with this node.
  68.  *
  69.  * This structure can only be allocated by iffparse.library
  70.  *)
  71.   ContextNodePtr * = UNTRACED POINTER TO ContextNode;
  72.   ContextNode * = STRUCT (node *: e.MinNode)
  73.     id   *: LONGINT;
  74.     type *: LONGINT;
  75.     size *: LONGINT;        (*  Size of this chunk             *)
  76.     scan *: LONGINT;        (*  # of bytes read/written so far *)
  77.   END;
  78.  
  79.  
  80. (*****************************************************************************)
  81.  
  82. (* Local context items live in the ContextNode's.  Each class is identified
  83.  * by its lci_Ident code and has a (private) purge vector for when the
  84.  * parent context node is popped.
  85.  *
  86.  * This structure can only be allocated by iffparse.library
  87.  *)
  88.   LocalContextItemPtr * = UNTRACED POINTER TO LocalContextItem;
  89.   LocalContextItem * = STRUCT (node *: e.MinNode)
  90.     id    *: LONGINT;
  91.     type  *: LONGINT;
  92.     ident *: LONGINT;
  93.   END;
  94.  
  95.  
  96. (*****************************************************************************)
  97.  
  98. (* StoredProperty: a local context item containing the data stored
  99.  * from a previously encountered property chunk.
  100.  *)
  101.   StoredPropertyPtr * = UNTRACED POINTER TO StoredProperty;
  102.   StoredProperty * = STRUCT
  103.     size * : LONGINT;
  104.     data * : e.APTR;
  105.   END;
  106.  
  107. (*****************************************************************************)
  108.  
  109. (* Collection Item: the actual node in the collection list at which
  110.  * client will look.  The next pointers cross context boundaries so
  111.  * that the complete list is accessable.
  112.  *)
  113.   CollectionItemPtr * = UNTRACED POINTER TO CollectionItem;
  114.   CollectionItem * = STRUCT
  115.     next * : CollectionItemPtr;
  116.     size * : LONGINT;
  117.     data * : e.APTR;
  118.   END;
  119.  
  120. (*****************************************************************************)
  121.  
  122. (* Structure returned by OpenClipboard().  You may do CMD_POSTs and such
  123.  * using this structure.  However, once you call OpenIFF(), you may not
  124.  * do any more of your own I/O to the clipboard until you call CloseIFF().
  125.  *)
  126.   ClipboardHandlePtr * = UNTRACED POINTER TO ClipboardHandle;
  127.   ClipboardHandle * = STRUCT (req * : cb.IOClipReq)
  128.     cbport * : e.MsgPort;
  129.     satisfyPort * : e.MsgPort;
  130.   END;
  131.  
  132. (*****************************************************************************)
  133. CONST
  134. (* IFF return codes.  Most functions return either zero for success or
  135.  * one of these codes.  The exceptions are the read/write functions which
  136.  * return positive values for number of bytes or records read or written,
  137.  * or a negative error code.  Some of these codes are not errors per sae,
  138.  * but valid conditions such as EOF or EOC (End of Chunk).
  139.  *)
  140.   errEOF          * = -1;     (*  Reached logical end of file *)
  141.   errEOC          * = -2;     (*  About to leave context      *)
  142.   errNoScope      * = -3;     (*  No valid scope for property *)
  143.   errNoMem        * = -4;     (*  Internal memory alloc failed*)
  144.   errRead         * = -5;     (*  Stream read error           *)
  145.   errWrite        * = -6;     (*  Stream write error          *)
  146.   errSeek         * = -7;     (*  Stream seek error           *)
  147.   errMangled      * = -8;     (*  Data in file is corrupt     *)
  148.   errSyntax       * = -9;     (*  IFF syntax error            *)
  149.   errNotIFF       * = -10;    (*  Not an IFF file             *)
  150.   errNoHook       * = -11;    (*  No call-back hook provided  *)
  151.   return2Client   * = -12;    (*  Client handler normal return*)
  152.  
  153. (*****************************************************************************)
  154.  
  155. (* Universal IFF identifiers *)
  156.   idFORM   * = y.VAL(LONGINT,"FORM");
  157.   idLIST   * = y.VAL(LONGINT,"LIST");
  158.   idCAT    * = y.VAL(LONGINT,"CAT ");
  159.   idPROP   * = y.VAL(LONGINT,"PROP");
  160.   idNULL   * = y.VAL(LONGINT,"    ");
  161.  
  162. (* Identifier codes for universally recognized local context items *)
  163.   lciPROP         * = y.VAL(LONGINT,"prop");
  164.   lciCOLLECTION   * = y.VAL(LONGINT,"coll");
  165.   lciENTRYHANDLER * = y.VAL(LONGINT,"enhd");
  166.   lciEXITHANDLER  * = y.VAL(LONGINT,"exhd");
  167.  
  168.  
  169. (*****************************************************************************)
  170.  
  171. (* Control modes for ParseIFF() function *)
  172.   parseScan       * = 0;
  173.   parseStep       * = 1;
  174.   parseRawStep    * = 2;
  175.  
  176.  
  177. (*****************************************************************************)
  178.  
  179. (* Control modes for StoreLocalItem() function *)
  180.   sliRoot         * = 1;      (*  Store in default context       *)
  181.   sliTop          * = 2;      (*  Store in current context       *)
  182.   sliProp         * = 3;      (*  Store in topmost FORM or LIST  *)
  183.  
  184. (*****************************************************************************)
  185.  
  186. (* Magic value for writing functions. If you pass this value in as a size
  187.  * to PushChunk() when writing a file, the parser will figure out the
  188.  * size of the chunk for you. If you know the size, is it better to
  189.  * provide as it makes things faster.
  190.  *)
  191.  
  192.   sizeUnknown     * = -1;
  193.  
  194. (*****************************************************************************)
  195.  
  196. (* Possible call-back command values *)
  197.   cmdInit     * = 0;       (*  Prepare the stream for a session    *)
  198.   cmdCleanup  * = 1;       (*  Terminate stream session            *)
  199.   cmdRead     * = 2;       (*  Read bytes from stream              *)
  200.   cmdWrite    * = 3;       (*  Write bytes to stream               *)
  201.   cmdSeek     * = 4;       (*  Seek on stream                      *)
  202.   cmdEntry    * = 5;       (*  You just entered a new context      *)
  203.   cmdExit     * = 6;       (*  You're about to leave a context     *)
  204.   cmdPurgeLCI * = 7;       (*  Purge a LocalContextItem            *)
  205.  
  206. VAR
  207.   base * : e.LibraryPtr;
  208.  
  209. (*--- functions in V36 or higher (Release 2.0) ---*)
  210.  
  211. (*------ Basic functions ------*)
  212.  
  213. PROCEDURE AllocIFF          *{base,- 30}(): IFFHandlePtr;
  214. PROCEDURE OpenIFF           *{base,- 36}(iff{8}            : IFFHandlePtr;
  215.                                          rwMode{0}         : LONGSET): LONGINT;
  216. PROCEDURE ParseIFF          *{base,- 42}(iff{8}            : IFFHandlePtr;
  217.                                          control{0}        : LONGINT): LONGINT;
  218. PROCEDURE CloseIFF          *{base,- 48}(iff{8}            : IFFHandlePtr);
  219. PROCEDURE FreeIFF           *{base,- 54}(ifff{8}           : IFFHandlePtr);
  220.  
  221. (*------ Read/Write functions ------*)
  222.  
  223. PROCEDURE ReadChunkBytes    *{base,- 60}(iff{8}            : IFFHandlePtr;
  224.                                          VAR buf{9}        : ARRAY OF e.BYTE;
  225.                                          numBytes{0}       : LONGINT): LONGINT;
  226. PROCEDURE WriteChunkBytes   *{base,- 66}(iff{8}            : IFFHandlePtr;
  227.                                          buf{9}            : ARRAY OF e.BYTE;
  228.                                          numBytes{0}       : LONGINT): LONGINT;
  229. PROCEDURE ReadChunkRecords  *{base,- 72}(iff{8}            : IFFHandlePtr;
  230.                                          VAR buf{9}        : ARRAY OF e.BYTE;
  231.                                          bytesPerRecord{0} : LONGINT;
  232.                                          numRecords{1}     : LONGINT): LONGINT;
  233. PROCEDURE WriteChunkRecords *{base,- 78}(iff{8}            : IFFHandlePtr;
  234.                                          buf{9}            : ARRAY OF e.BYTE;
  235.                                          bytesPerRecord{0} : LONGINT;
  236.                                          numRecords{1}     : LONGINT): LONGINT;
  237.  
  238. (*------ Context entry/exit ------*)
  239.  
  240. PROCEDURE PushChunk         *{base,- 84}(iff{8}            : IFFHandlePtr;
  241.                                          type{0}           : LONGINT;
  242.                                          id{1}             : LONGINT;
  243.                                          size{2}           : LONGINT): LONGINT;
  244. PROCEDURE PopChunk          *{base,- 90}(iff{8}            : IFFHandlePtr): LONGINT;
  245.  
  246. (*------ Low-level handler installation ------*)
  247.  
  248. PROCEDURE EntryHandler      *{base,-102}(iff{8}            : IFFHandlePtr;
  249.                                          type{0}           : LONGINT;
  250.                                          id{1}             : LONGINT;
  251.                                          position{2}       : LONGINT;
  252.                                          handler{9}        : u.HookPtr;
  253.                                          object{10}        : e.APTR): LONGINT;
  254. PROCEDURE ExitHandler       *{base,-108}(iff{8}            : IFFHandlePtr;
  255.                                          type{0}           : LONGINT;
  256.                                          id{1}             : LONGINT;
  257.                                          position{2}       : LONGINT;
  258.                                          handler{9}        : u.HookPtr;
  259.                                          object{10}        : e.APTR): LONGINT;
  260.  
  261. (*------ Built-in chunk/property handlers ------*)
  262.  
  263. PROCEDURE PropChunk         *{base,-114}(iff{8}            : IFFHandlePtr;
  264.                                          type{0}           : LONGINT;
  265.                                          id{1}             : LONGINT): LONGINT;
  266. PROCEDURE PropChunks        *{base,-120}(iff{8}            : IFFHandlePtr;
  267.                                          propArray{9}      : ARRAY OF LONGINT;
  268.                                          numPairs{0}       : LONGINT): LONGINT;
  269. PROCEDURE StopChunk         *{base,-126}(iff{8}            : IFFHandlePtr;
  270.                                          type{0}           : LONGINT;
  271.                                          id{1}             : LONGINT): LONGINT;
  272. PROCEDURE StopChunks        *{base,-132}(iff{8}            : IFFHandlePtr;
  273.                                          propArray{9}      : ARRAY OF LONGINT;
  274.                                          numPairs{0}       : LONGINT): LONGINT;
  275. PROCEDURE CollectionChunk   *{base,-138}(iff{8}            : IFFHandlePtr;
  276.                                          type{0}           : LONGINT;
  277.                                          id{1}             : LONGINT): LONGINT;
  278. PROCEDURE CollectionChunks  *{base,-144}(iff{8}            : IFFHandlePtr;
  279.                                          propArray{9}      : ARRAY OF LONGINT;
  280.                                          numPairs{0}       : LONGINT): LONGINT;
  281. PROCEDURE StopOnExit        *{base,-150}(iff{8}            : IFFHandlePtr;
  282.                                          type{0}           : LONGINT;
  283.                                          id{1}             : LONGINT): LONGINT;
  284.  
  285. (*------ Context utilities ------*)
  286.  
  287. PROCEDURE FindProp          *{base,-156}(iff{8}            : IFFHandlePtr;
  288.                                          type{0}           : LONGINT;
  289.                                          id{1}             : LONGINT): StoredPropertyPtr;
  290. PROCEDURE FindCollection    *{base,-162}(iff{8}            : IFFHandlePtr;
  291.                                          type{0}           : LONGINT;
  292.                                          id{0}             : LONGINT): CollectionItemPtr;
  293. PROCEDURE FindPropContext   *{base,-168}(iff{8}            : IFFHandlePtr): ContextNodePtr;
  294. PROCEDURE CurrentChunk      *{base,-174}(iff{8}            : IFFHandlePtr): ContextNodePtr;
  295. PROCEDURE ParentChunk       *{base,-180}(contextNode{8}    : ContextNodePtr): ContextNodePtr;
  296.  
  297. (*------ LocalContextItem support functions ------*)
  298.  
  299. PROCEDURE AllocLocalItem    *{base,-186}(type{0}           : LONGINT;
  300.                                          id{1}             : LONGINT;
  301.                                          ident{2}          : LONGINT;
  302.                                          dataSize{3}       : LONGINT): LocalContextItemPtr;
  303. PROCEDURE LocalItemData     *{base,-192}(localItem{8}      : LocalContextItemPtr): e.APTR;
  304. PROCEDURE SetLocalItemPurge *{base,-198}(localItem{8}      : LocalContextItemPtr;
  305.                                          purgeHook{9}      : u.HookPtr);
  306. PROCEDURE FreeLocalItem     *{base,-204}(localItem{8}      : LocalContextItemPtr);
  307. PROCEDURE FindLocalItem     *{base,-210}(iff{8}            : IFFHandlePtr;
  308.                                          type{0}           : LONGINT;
  309.                                          id{1}             : LONGINT;
  310.                                          ident{2}          : LONGINT ): LocalContextItemPtr;
  311. PROCEDURE StoreLocalItem    *{base,-216}(iff{8}            : IFFHandlePtr;
  312.                                          localItem{9}      : LocalContextItemPtr;
  313.                                          position{0}       : LONGINT): LONGINT;
  314. PROCEDURE StoreItemInContext*{base,-222}(iff{8}            : IFFHandlePtr;
  315.                                          localItem{8}      : LocalContextItemPtr;
  316.                                          contextNode{10}   : ContextNodePtr);
  317.  
  318. (*------ IFFHandle initialization ------*)
  319.  
  320. PROCEDURE InitIFF           *{base,-228}(iff{8}            : IFFHandlePtr;
  321.                                          flags{0}          : LONGSET;
  322.                                          streamHook{9}     : u.HookPtr);
  323. PROCEDURE InitIFFasDOS      *{base,-234}(iff{8}            : IFFHandlePtr);
  324. PROCEDURE InitIFFasClip     *{base,-240}(iff{8}            : IFFHandlePtr);
  325.  
  326. (*------ Internal clipboard support ------*)
  327.  
  328. PROCEDURE OpenClipboard     *{base,-246}(unitNumber{0}     : LONGINT): ClipboardHandlePtr;
  329. PROCEDURE CloseClipboard    *{base,-252}(clipHandle{8}     : ClipboardHandlePtr);
  330.  
  331. (*------ Miscellaneous ------*)
  332.  
  333. PROCEDURE GoodID            *{base,-258}(id{0}             : LONGINT): LONGINT;
  334. PROCEDURE GoodType          *{base,-264}(type{0}           : LONGINT): LONGINT;
  335. PROCEDURE IDtoStr           *{base,-270}(id{0}             : LONGINT;
  336.                                          VAR buf{8}        : ARRAY OF CHAR);
  337.  
  338.  
  339. (* $OvflChk- $RangeChk- $StackChk- $NilChk- $ReturnChk- $CaseChk- *)
  340.  
  341. BEGIN
  342.   base :=  e.OpenLibrary(iffparseName,37);
  343.  
  344. CLOSE
  345.   IF base#NIL THEN e.CloseLibrary(base) END;
  346.  
  347. END IFFParse.
  348.